package com.network.retrofit.net;


import com.network.retrofit.net.http.ExceptionHandle;
import com.network.retrofit.net.http.ResponseThrowable;
import com.network.retrofit.utils.NetWorkBaseUtil;
import com.network.retrofit.utils.NetWorkLogUtil;

import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;

/**
 * 项目创建人:
 * 创建人:fargo(罗)
 * Created by app on 2020/9/14  —————— 14:16
 * 作用: 结果解析类
 * 备注: 这里规定返回值 必须是BaseResponseBean的之类 不用泛型 方便解码使用 以及在这个类拦截一些特殊情况
 **/
public abstract class ApiResponse<T> implements Observer<T>,IResponse<T>{

    private Disposable disposable;

    public void cancel() {
        //取消所有订阅
        if (disposable != null && !disposable.isDisposed()) {
            disposable.dispose();
        }
    }

    // 起点分发的时候 准备工作
    @Override
    public void onSubscribe(Disposable d) {
        NetWorkLogUtil.logE("onSubscribe", "onSubscribe");
        disposable = d;
    }

    //获得数据 下流的时候
    @Override
    public void onNext(T data) {
        if (data == null) {
            NetWorkLogUtil.logE("data 为空");
            responseNull();
            cancel();
            return;
        }

        NetWorkLogUtil.logE("onNext", NetWorkBaseUtil.getInstance().getGson().toJson(data));
        responseData(data);
        cancel();
    }

    @Override
    public void onError(Throwable e) {
        NetWorkLogUtil.logE("onError", e.toString());
        cancel();

        ResponseThrowable responseThrowable = ExceptionHandle.handleException(e);
        if (responseThrowable != null) {
            NetWorkLogUtil.logE("onError----", "错误地址" + responseThrowable.getResponseUrlContent() + "       错误信息" + responseThrowable.getCode() + responseThrowable.getMessage());
            netError(responseThrowable);
        } else {
            NetWorkLogUtil.logE("onError----getCause", e.getCause().toString());
            netError(null);
        }
    }

    @Override
    public void onComplete() {
        NetWorkLogUtil.logE("onComplete", "onComplete");
        cancel();
    }


}
